#ifndef __SEQLIST_H__
#define __SEQLIST_H__
                            
/**
 * 顺序表的优势：随机访问
 * 顺序表的缺点：插入和删除元素的性能差，需要移动元素，插入还涉及到扩容
 */
typedef struct seqlist {
    // 顺序表的长度（顺序表中当前元素的个数）
    unsigned length;
    // 顺序表的容量（顺序表能容纳的最大元素数）
    unsigned capicity;
    // 顺序表的底层数组
    int data[0];
} seqlist;

/**
 * 创建一个新的容量为capicity的顺序表
 * @param capacity 顺序表的初始容量
 * @return 新创建的顺序表的指针
 */
extern seqlist* create_list(unsigned capicity);

/**
 * 销毁顺序表
 * @param list 待销毁的顺序表
 */
extern void free_list(seqlist* list);

/**
 * 遍历顺序表
 * @param list 要遍历的顺序表
 * @param callback 回调函数
 */
extern void visit_list(seqlist* list, void (*callback)(int));

/**
 * 向顺序表中指定位置插入元素
 * @param list 待插入的列表
 * @param p 待插入元素的位置（在指针p指向的元素的后面插入一个新元素）
 * @param val 新元素的值
 */
extern seqlist* insert(seqlist* list, int* p, int val);

/**
 * 删除顺序表中指定位置的元素
 * @param list 待删除元素的列表
 * @param p 待删除元素的位置
 */
extern void remove(seqlist* list, int* p);

/**
 * 在顺序表中查找指定的元素，如果找到，则返回该元素的指针，否则返回空指针
 * @param list 顺序表
 * @param val 待查找的元素
 */
extern int* find(seqlist* list, int val);

#endif